package com.ms.oschina;

import java.lang.Thread.UncaughtExceptionHandler;

import com.ms.oschina.util.LogUtils;

import android.content.Context;
import android.os.Build;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

/**
 * 用来处理我们程序当中所有未被捕获的异常
 * 
 * @author Administrator
 * 
 */
public class CrashHandler implements UncaughtExceptionHandler {

	private Context mContext;
	private UncaughtExceptionHandler defaultUncaughtExceptionHandler;

	private CrashHandler() {
	}

	public static CrashHandler ch = null;

	public static CrashHandler getInstance() {
		if (ch == null) {
			synchronized (CrashHandler.class) {
				if (ch == null) {
					return new CrashHandler();
				}
			}
		}
		return ch;
	}

	public void init(Context context) {
		this.mContext = context;
		// 系统默认的处理器
		defaultUncaughtExceptionHandler = Thread
				.getDefaultUncaughtExceptionHandler();
		// 将当前CrashHandler作为程序的默认捕获异常处理器
		Thread.setDefaultUncaughtExceptionHandler(this);
	}

	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		ex.printStackTrace();
		if (isHandle(ex)) {
			// 自定义异常处理
			handleException(ex);
		} else {
			defaultUncaughtExceptionHandler.uncaughtException(thread, ex);
		}
	}

	/**
	 * 通常处理： 把异常信息以及当前运行的设备、版本信息发动给服务端,
	 * 
	 * @param ex
	 */
	private void handleException(final Throwable ex) {
		String name = Thread.currentThread().getName();
		LogUtils.e("name:"+name);
		// 直接打印toast不会显示，因为是单独的线程.
		
		new Thread() {
			@Override
			public void run() {
				// Looper.prepare()---开启looper...Android默认情况下,线程是没有开启looper的（主线程除外,主线程默认就会绑定一个looper）
				Looper.prepare();
				Toast.makeText(mContext, ex.toString(), Toast.LENGTH_SHORT)
						.show();
				Toast.makeText(mContext, "很抱歉，程序出现异常，即将退出....",
						Toast.LENGTH_SHORT).show();
				// Looper.loop()---让looper开发工作
				Looper.loop();
			}
		}.start();
		collectInfo(ex);

		// 3秒后退出系统
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		android.os.Process.killProcess(android.os.Process.myPid());
		// 关闭虚拟机，释放所有内存

		System.exit(0);
	}

	private void collectInfo(Throwable ex) {
		// 设置信息：设备参数+版本+手机制造商+android系统版本
		final String deviceInfo = Build.DEVICE + "----" + Build.MODEL + "-----"
				+ Build.PRODUCT + "----" + Build.VERSION.SDK_INT;
		final String errorInfo = ex.getMessage();
		new Thread() {
			@Override
			public void run() {
				// //信息发送给服务器...todo
				Log.e("zoubo", deviceInfo + "\n" + errorInfo);
			}
		}.start();
	}

	public boolean isHandle(Throwable ex) {
		if (ex == null) {
			return false;
		}
		return true;
	}

}
